#38  WAV/VOC/SND/IFF/AU/RAW  8bit laden

searching for WAV/VOC/SND/IFF/AU/RAW/SAM/MAT files (Maximum 4096).
select one File out of the scrollmenu, this file is shown on the SCREEN,
and you can select the starting-point for loading with the mouse:

                Esc:  Escape   
Tab, right Mousekey:  switch between signed/unsigned Mode.
      left Mousekey:  loading file at starting-point.

FFT4WAVE knows only the Headertype of WAV-files, used WAV-header-Information:
Samplerate,  8bit_unsigned / 16bit_signed, Stereo/Mono.
  Stereo WAV-files are loading as   Real & Imag.  DATA,
and MONO WAV-files (default) are loading as reell DATA.
FFT4WAVE read only so many DATA as defined in the FFT4WAVE.INI file!
VOC/SND/IFF/AU/RAW/SAM/MAT files are loading as mono 8bit unsigned,
with the Samplerate (11000) defined in the FFT4WAVE.INI file.

#39  WAV/VOC/SND/IFF/AU/RAW 16bit laden

searching for WAV/VOC/SND/IFF/AU/RAW/SAM/MAT files (Maximum 4096).
select one File out of the scrollmenu, this file is shown on the SCREEN,
and you can select the starting-point for loading with the mouse:

                Esc:  Escape   
Tab, right Mousekey:  switch between signed/unsigned Mode.
      left Mousekey:  loading file at starting-point.

FFT4WAVE knows only the Headertype of WAV-files, used WAV-header-Information:
Samplerate,  8bit_unsigned / 16bit_signed, Stereo/Mono.
  Stereo WAV-files are loading as   Real & Imag.  DATA,
and MONO WAV-files (default) are loading as reell DATA.
FFT4WAVE read only so many DATA as defined in the FFT4WAVE.INI file!
VOC/SND/IFF/AU/RAW/SAM/MAT files are loading as mono 16bit signed,
with the Samplerate (11000) defined in the FFT4WAVE.INI file.

#11  WAV-Datei Aufnahme mit 11kHz

Functionnumber 1...19 used for adding of extern programs to the MENU!

1.....9  exit FFT4WAVE   without save DATA.
10...19  save all DATA, then exit FFT4WAVE.

FFT4WAVE give DOS the functionnumber as ERRORLEVEL back.
the ERRORLEVEL is usefull in the START.BAT file,
to select the extern program, and start it over the START.BAT file.

Functionnumber 11 start an external program:     RWAVE fft.wav 11000
this program record the "FFT.WAV" file, with the Samplerate of 11000 1/s.

#12  WAV-Datei Aufnahme mit 22kHz

Functionnumber 1...19 used for adding of extern programs to the MENU!

1.....9  exit FFT4WAVE   without save DATA.
10...19  save all DATA, then exit FFT4WAVE.

FFT4WAVE give DOS the functionnumber as ERRORLEVEL back.
the ERRORLEVEL is usefull in the START.BAT file,
to select the extern program, and start it over the START.BAT file.

Functionnumber 12 start an external program:     RWAVE fft.wav 22000
this program record the "FFT.WAV" file, with the Samplerate of 22000 1/s.

#13  WAV-Datei Aufnahme mit 44kHz

Functionnumber 1...19 used for adding of extern programs to the MENU!

1.....9  exit FFT4WAVE   without save DATA.
10...19  save all DATA, then exit FFT4WAVE.

FFT4WAVE give DOS the functionnumber as ERRORLEVEL back.
the ERRORLEVEL is usefull in the START.BAT file,
to select the extern program, and start it over the START.BAT file.

Functionnumber 13 start an external program:     RWAVE fft.wav 44000
this program record the "FFT.WAV" file, with the Samplerate of 44000 1/s.

#8  Formeln...

    extern added Formula-Interpreter / Functionsgenerator
--------------------------------------------------------------
give an equation like 'y=5*sin(x)-1+abs(x)*x' or 'y=rect(t)+t'
(let the "y=" away!) and You get the DATA from the formula...

the DATA exist in the FFT typical form, with Zero in X-direction at
the left and right border, if for "Xmin" given a negative number!
(you can change this with Zero_swapping_shifting_X)

Variables & Constants:
-----------------------
t = x           
e = 2.718281828
p = 3.141592654 = π
m = 6.283185307 = 2π
q = 9.869604401 = π²
l = 0.693147181 = ln(2) 
w = 1.414213562 = √2
v = 0.707106781 = 1/√2
d = 1.732050808 = √3

Functions:
-----------
   sin()     cos()     tan()
Arcsin()  Arccos()  Arctan()
Si()      <== Si(x)=sin(x)/x 
ln()      <== Logarithmus to Basis e
log()     <== Logarithmus to Basis 10
Wurzel()  <== squareroot...
abs()     <== abs(x>0)=x,  abs(x<0)=-x
sgn()     <== sgn(<0)=-1   sgn(0)=0   sgn(>0)=1
Sprung()  <== Sprung(>=0)=1        Sprung(<0)=0
clip()    <== clip(<-1)=-1   clip(x)=x   clip(>1)=1
noise(x)  <== randomnumber, range -x ... x
data(x)   <== randomnumber, range 0,1,2,3,4...x
rect()    <== rect(-0.5<x<0.5)=1               else 0
dreieck() <== dreieck(-1<x<1)=1-abs(x)         else 0
ramp()    <== ramp(-1<x<1)=0.5*x+0.5           else 0
Hanning() <== Hanning(-1<x<1)=0.5+0.5cos(π*x)  else 0
diracs()  <== diracs(x=int(x)) = (1)           else 0
dirac()   <== dirac( x = 0 )   = (1)           else 0
exp()     <== exp(0<x) = e^(-ln(2)*x )         else 0
gauss(x)  <==            e^(-ln(2)*x²)

the exact programming of some definate formulas is different,
to make the formula work perfect under all conditions!

the following Operators exist:
------------------------------
 +   Addition
 -   Subtraction
 *   Multiplication
 /   Divison
 ^   Power
 #   Folding   (I know '*' is exactly the Folding-Operator,
                and not stands for Multiplication, but IBM don't know that...)

Der Foldingoperator '#' is illegal inside of '('  ')'.
(but more than one Foldingoperator inside an equation is okay!)
the Foldingoperator '#' split the equation in some smaller equations,
calculate the smaller equations, and folding them together with
the FFT-folding (FFT of splitted DATA, multiply, inverseFFT).

I'am very proud that the Folding work perfect under all conditions.

hierarchy of Operators:      1.level    ( )
                             2.level    + - * / ^
                             3.level    #

Operators at the same level are calculated from left to right:
e*t-p^2*sin(t)       is calculated as      [[[e*t]-p]^2]*sin(t)
(e*t)-((p^2)*sin(t))    calculate with the correct mathematics hierarchy...

Negative Numbers:  -z  input as  (0-z)

  'Esc'  break the Functiongenerator, return to FFT4WAVE!
  'Del'  DATA is shit, input a new formula...
 'Enter' give DATA back to FFT4WAVE (TEMP.FFT) and return to FFT4WAVE.

FFT4WAVE loading TEMP.FFT automatic at programstart.

#40  alle Daten (.FFT)  laden

shows all *.FFT files of the FFT4WAVE directory,
select a file out of the scrollmenu for loading, or press Escape!
*.FFT is the most important file-format of FFT4WAVE,
it inlcude all DATA and all Header-Information.


the *.FFT DATA-format:
-----------------------
long    Status
long    AnzahlNormal
long    AnzahlReal
long    AnzahlImag
double  Samplerate
double  real[0...AnzahlReal]         //  {real[] Array}
double  imag[0...AnzahlImag]         //  {imag[] Array}



Status:  bit0 =  (Stereo)        reell / complex DATA
         bit1 = (FFTflag)    time_area / frequency_area
         bit2 =  (Nykill)  transformed reell DATA
         following combinations make sense:
Status= 0     Reell DATA in time_area
Status= 1   complex DATA in time_area
Status= 3   complex DATA in Frequency_area, 0...Samplerate
Status= 7   complex DATA in Frequency_area, 0...Samplerate/2

AnzahlNormal is the valid DATAlength:
Komplexen Daten:  AnzahlNormal = the smaller value of {AnzahlReal,AnzahlImag}
Reell DATA:       AnzahlNormal = AnzahlReal + AnzahlImag;

Reell DATA is saved alternately in real[] and imag[] array:
real[] = { 0, 2, 4, 6, 8, 10, 12, 14, ...};
imag[] = { 1, 3, 5, 7, 9, 11, 13, 15, ...};
the numbers stand for the order of the reell DATA.

#41  alle Daten (.FFT)  speichern

shows all *.FFT files of the FFT4WAVE directory,
you must input a new filename for saving,
but you mustn't give the file_exension .FFT
*.FFT is the most important file-format of FFT4WAVE,
it inlcude all DATA and all Header-Information.


the *.FFT DATA-format:
-----------------------
long    Status
long    AnzahlNormal
long    AnzahlReal
long    AnzahlImag
double  Samplerate
double  real[0...AnzahlReal]         //  {real[] Array}
double  imag[0...AnzahlImag]         //  {imag[] Array}



Status:  bit0 =  (Stereo)        reell / complex DATA
         bit1 = (FFTflag)    time_area / frequency_area
         bit2 =  (Nykill)  transformed reell DATA
         following combinations make sense:
Status= 0     Reell DATA in time_area
Status= 1   complex DATA in time_area
Status= 3   complex DATA in Frequency_area, 0...Samplerate
Status= 7   complex DATA in Frequency_area, 0...Samplerate/2

AnzahlNormal is the valid DATAlength:
Komplexen Daten:  AnzahlNormal = the smaller value of {AnzahlReal,AnzahlImag}
Reell DATA:       AnzahlNormal = AnzahlReal + AnzahlImag;

Reell DATA is saved alternately in real[] and imag[] array:
real[] = { 0, 2, 4, 6, 8, 10, 12, 14, ...};
imag[] = { 1, 3, 5, 7, 9, 11, 13, 15, ...};
the numbers stand for the order of the reell DATA.

#42  Importiere als  Reell

Import Headerless Numbers,
in 'Text' , 'Float' or 'Double' Format
as Reell DATA in time_area.

Reell DATA are saved alternately in real[] and imag[] array:
real[] = { 0, 2, 4, 6, 8, 10, 12, 14, ...};
imag[] = { 1, 3, 5, 7, 9, 11, 13, 15, ...};
the numbers stand for the order of the reell DATA.
so the memory is used twice efficient as for complex DATA.
it is very easy to transform reell DATA to complex DATA by overloading
the imaginary part with 0    "zero.(f)"

first select a Format: (Text, Float, Double), then all files of the chosen
type are in the scrollmenu. select a file for loading as reell DATA.
this is the last change to press 'Esc' for escape to MENU!



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#43  Importiere als  Real

Import Headerless Numbers,
in 'Text' , 'Float' or 'Double' Format
as realpart of complex DATA in time_area.
the imaginarypart don't change...

It happens often, that realpart and imaginarypart have different length,
it is even possible to save this fully in a  *.FFT file!
some functions need that DATA of both realpart & imaginarypart exist, like:
Hanning Window, FFT, X-Scaling, Y-Scaling, Polar -> real & imag,  
Zero_swapping_shifting_X, Absolute ERROR, complex Folding.
In this case the shorter length is used as valid DATAlength, this length is
shown in Status-Information and used for visualize the DATA.
some functions must correct different length to the shorter length, like:
FFT, X-Scaling, Y-Scaling, Absolute ERROR, and the complexe Folding.

use of dynamic different DATAlength of realpart & imaginarypart:

fill      Realpart mit  800 values
fill Imaginarypart mit 1024 values   /valid DATAlength=800
fill Imaginarypart mit  512 values   /valid DATAlength=512
fill      Realpart mit 8192 values   /valid DATAlength=512
fill Imaginarypart mit 9000 values   /valid DATAlength=8192


first select a Format: (Text, Float, Double), then all files of the chosen type
in the FFT4WAVE directory are in the scrollmenu. select one file for loading.
this is the last change to press 'Esc' for escape to MENU!



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#44  Importiere als  Imag.

Import Headerless Numbers,
in 'Text' , 'Float' or 'Double' Format
as imaginarypart of complex DATA in time_area.
the realpart don't change...

It happens often, that realpart and imaginarypart have different length,
it is even possible to save this fully in a  *.FFT file!
some functions need that DATA of both realpart & imaginarypart exist, like:
Hanning Window, FFT, X-Scaling, Y-Scaling, Polar -> real & imag,  
Zero_swapping_shifting_X, Absolute ERROR, complex Folding.
In this case the shorter length is used as valid DATAlength, this length is
shown in Status-Information and used for visualize the DATA.
some functions must correct different length to the shorter length, like:
FFT, X-Scaling, Y-Scaling, Absolute ERROR, and the complexe Folding.

use of dynamic different DATAlength of realpart & imaginarypart:

fill      Realpart mit  800 values
fill Imaginarypart mit 1024 values   /valid DATAlength=800
fill Imaginarypart mit  512 values   /valid DATAlength=512
fill      Realpart mit 8192 values   /valid DATAlength=512
fill Imaginarypart mit 9000 values   /valid DATAlength=8192


Tip: it is easy to transform Reell DATA to complexe DATA by import  ZERO.(F)
as imaginarypart. it is also possible to export the Reell DATA, then
importing the exported DATA as realpart, and import ZERO.(F) as imaginarypart.

first select a Format: (Text, Float, Double), then all files of the chosen type
in the FFT4WAVE directory are in the scrollmenu. select one file for loading.
this is the last change to press 'Esc' for escape to MENU!



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#45  Importiere als  Real & Imag.

Import Headerless Numbers,
in 'Text' , 'Float' or 'Double' Format
as complex DATA in time_area.

       0 ... length/2-1               realpart
length/2 ... length-1            imaginarypart

the first half is realpart, the second half is imaginarypart.

first select a Format: (Text, Float, Double), then all files of the chosen type
in the FFT4WAVE directory are in the scrollmenu. select one file for loading.
this is the last change to press 'Esc' for escape to MENU!



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#46  exportiere     Alles

Export (save) all DATA (Reell or complex) as Headerless numbers
in 'Text' , 'Float' or 'Double' Format.
Information like  time_area / frequency_Area, Samplerate, complex/reell,
is not saved, and going lost!   only the raw DATA is saved.

if the DATA is complex, Realpart is first saved and then the Imaginarypart,
but only from 0 to DATAlength, so that both parts have the same length!
reell DATA is not saved alternately in two parts...

first select a Format: (Text, Float, Double), then all files of the chosen type
in the FFT4WAVE directory are shown, enter a new filename without extension!



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#47  exportiere nur Real

Export (save) only the realpart of complex DATA as Headerless numbers
in 'Text' , 'Float' or 'Double' Format.
Information like  time_area / frequency_Area, Samplerate, complex/reell,
is not saved, and going lost!   only the raw DATA is saved.
never use this function on reell DATA.

first select a Format: (Text, Float, Double), then all files of the chosen type
in the FFT4WAVE directory are shown, enter a new filename without extension!



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#48  exportiere nur Imaginär

Export (save) only the imaginarypart of complex DATA as Headerless numbers
in 'Text' , 'Float' or 'Double' Format.
Information like  time_area / frequency_Area, Samplerate, complex/reell,
is not saved, and going lost!   only the raw DATA is saved.
never use this function on reell DATA.

first select a Format: (Text, Float, Double), then all files of the chosen type
in the FFT4WAVE directory are shown, enter a new filename without extension!
Exportiert (speichert) nur den Imaginärteil von komplexen Daten als
Headerlose Zahlen hintereinander, im 'Text' , 'Float' oder 'Double' Format.



Text - Format:   *.(T)
-----------------------
all files with the extension .(T) are Textformat numbers.
every text-line include one number in ASCII-text format!
(after the number can stand a remark)
the following characters are part of a ASCII-text-number:  1234567890. -e
examples:
   24        ;this is a remark
  3.14159  
-0.75
 1.2345e-12  =  1.2345*10^-12 = 0.0000000000000012345  <--remark
-1.7e6       = -1.7000*10^6   = 1700000.0              <--remark
0
-234567.7578 = remark too



Float - Format:   *.(F)
------------------------
All files with the extension .(F) are Floatformat numbers,
the Floatformat is a 4 byte long numeric format of the language C.
DATAlength = filelength_in_bytes / 4 



Double - Format:   *.(D)
-------------------------
All files with the extension .(D) are Doubleformat numbers,
the Doubleformat is a 8 byte long numeric format of the language C.
(files with the extension .FFT use double format too, but *.FFT have a Header)
DATAlength = filelength_in_bytes / 8

#37  Hilfe (Wichtig)
use the mouse to see the full Text (scrolling).

you have full mouse controll of the Program,
the left Mousekey mostly start functions,
and the right Mousekey mostly give you Help for every Menu-function,
'F1' just do the same (read contextsensitve HELP).

the key 'Esc' break off functions, (inclusive Undo),
nearly all functions allow to break off to the last moment before DATA change.

the word 'reell' mean that the DATA is not complex DATA !!!

the program is buffer orientated, the DATA is in the buffer.
the buffer is the real[] array (realpart),and the imag[] array (imaginary part)
(reell DATA is alternately in real[] & imag[] array saved.)
the buffer have some headerinformation, like Samplerate (for scale/visualize),
complex/reell DATA, DATA is time_area / frequency_area ... 

it is possible to save the graphic-screen in a Windows 3.0 Bitmap file,
the uncompressed Bitmap-file work with Windows 3.1 too!
press 'F9' or 'F10' key to save the screen, the black/white Bitmap
need only  38k...98k  diskspace per picture,
and the BILD_???.BMP files are numbered from 001 to 999.

the FFT4WAVE.INI file is important, and editable with every DOS-ASCII-EDITOR.
it include the colorpalette, SETUP Information, and MENU structure.
(the Help file 'FFT4WAVE.HLP' have the same structure but more easy)
-------------------------------------------------------------------------------
the FFT4WAVE.INI file beginns with 20 Colors,in 20 following lines,
followed from remarks. the last 3 'Farben' (colors), are no colors:

'Farbe 17' how many scanvalues (DATA) to read from a SOUND file...
'Farbe 18' Samplerate of unknown SOUND files formats (not WAV).
'Farbe 19' Beginnersmode/Professionalmode: Beginnersmode give more Information
           in Graphicsmode, and a better cooler Textmodefont!

the following line is the Graphicsmode:
1 = 640x480,   2 = 800x600,   3 = 1024x768,
default is 640x480 in 16 colors, change this entry only if your Graphiccard &
Monitor support that SVGA-VESA-Mode, a VESA-driver can help you!

the following lines include the MENU-structure:
maximum is 9 column * 24 lines, FFT4WAVE automaticly count column & lines. 
Never use more than 9 column and 24 lines, to prevent systemcrashs!
it is not important how many lines different column have.
FFT4WAVE's default MENU structure use only 2 column for now...
every column starts with the column-title, then follow the lines of the column.
to select between line and column, a line starts with a '#'.

example:      ┌─────────────────────────────────────┐
              │this is a column-title               │
              │#FunctionsNumber  Functionsname      │
              │#34               that is a line     │
              │#9                schnell beenden!   │
              │#19               beenden!           │
              │Und jetzt kommt die nächste Spalte...│
              │#11               record with 11kHz  │
              │#8                Formel eingeben    │
              └─────────────────────────────────────┘

the Functionsname is shown in the MENU,
and the FunktionsNumber select what Function have to be executed.

this is very usefull to create language supports for other languages!
and you only need a texteditor to do this, it is also possible to
disable functions you dont need, over the MENU structure!

I'am very happy if you release other language supports of FFT4WAVE.
you see how bad my english is...
i have nothing against if you release better modifyed Versions of my program,
this is why i include the full Borland_C sourcecode... 
but dont forget to set my Name inside (and your Name too)!

Lars Otte  (DrCaos)
#9   schnell Beenden!
Exit FFT4WAVE without save the DATA!
#19  Exit/Beenden! 
SAVE all DATA in "TEMP.FFT" and exit FFT4WAVE.
(FFT4WAVE loading "TEMP.FFT" automaticly at programstart!)
#21  Eingabe mit Filtertyp Digital

Input of DATA with the mouse (the mouse draw lines and set dots).

missing scanvalues are interpolated with a digital Interpolation-Filter.
this Filter just repeat the last given scanvalue for interpolation.


after starting this function use the following keys:
-----------------------------------------------------
Esc               Undo, escape back to MENU!
Del               clean screen, draw scale_units (DIV), mouse-input again
Enter             accept all scanvalues , continue
right Mousekey    accept all scanvalues , continue
left  Mousekey    set dot, Line = hold mousekey and move the mouse
F9                write screen in BILD_???.BMP file
F10               like F9, but Farbe[2] (color) is dotted
R                 show old       Realpart maximum_scaled in Farbe[3] (color)
I                 show old  Imaginarypart maximum_scaled in Farbe[3] (color)
B                 show old Real&Imag.part maximum_scaled in Farbe[3] (color)

after scanvalues given by mouse, and 'Enter' is pressed, missing scanvalues
are interpolated, and the result of the interpolation is shown.
you can press 'F9' or 'F10' to write the screen as a Windows 3.0 BMP-file.
   (the BILD_???.BMP files are numbered automatically from 001 to 999)

now use the following keys:
-----------------------------------------------
Esc                 Undo, escape back to MENU!
1                   RC-smoothfilter strength 1
2                   RC-smoothfilter strength 2
3                   RC-smoothfilter strength 3
4                   RC-smoothfilter strength 4
5                   RC-smoothfilter strength 5
6                   RC-smoothfilter strength 6
7                   Symmetrical-smoothfilter strength 1
8                   Symmetrical-smoothfilter strength 2
9                   Symmetrical-smoothfilter strength 3
0                   Symmetrical-smoothfilter strength 4
other keys          DC/OFFSET = 0, continue...
left  mousekey      DC/OFFSET = 0, continue...
right mousekey      Input of a Zero-level with the mouse, after that continue

Input of a Zero-level with the mouse:
the Zero-level is given by a line between two points,
have both points different height the Signal is rotating!
press right mousekey to set the first point,
and then move mouse and press again for the second point.

the Filters are 1.Order but if you filter the signal several times the
order is adding. so bigger the strength of the smoothfilter,
so lower is the cutoff frequency of the virtual lowpass.

after this FFT4WAVE want to know where to save the new signal,
this is your last change for pressing 'Esc' (Undo-function).
the signal can be saved as reell DATA,
realpart of complex DATA, Imaginarypart of complex DATA.

#22  Eingabe mit Filtertyp Linear

Input of DATA with the mouse (the mouse draw lines and set dots).

missing scanvalues are interpolated with a linear Interpolation-Filter.
this Filter connect given scanvalues with lines for interpolation.


after starting this function use the following keys:
-----------------------------------------------------
Esc               Undo, escape back to MENU!
Del               clean screen, draw scale_units (DIV), mouse-input again
Enter             accept all scanvalues , continue
right Mousekey    accept all scanvalues , continue
left  Mousekey    set dot, Line = hold mousekey and move the mouse
F9                write screen in BILD_???.BMP file
F10               like F9, but Farbe[2] (color) is dotted
R                 show old       Realpart maximum_scaled in Farbe[3] (color)
I                 show old  Imaginarypart maximum_scaled in Farbe[3] (color)
B                 show old Real&Imag.part maximum_scaled in Farbe[3] (color)

after scanvalues given by mouse, and 'Enter' is pressed, missing scanvalues
are interpolated, and the result of the interpolation is shown.
you can press 'F9' or 'F10' to write the screen as a Windows 3.0 BMP-file.
   (the BILD_???.BMP files are numbered automatically from 001 to 999)

now use the following keys:
-----------------------------------------------
Esc                 Undo, escape back to MENU!
1                   RC-smoothfilter strength 1
2                   RC-smoothfilter strength 2
3                   RC-smoothfilter strength 3
4                   RC-smoothfilter strength 4
5                   RC-smoothfilter strength 5
6                   RC-smoothfilter strength 6
7                   Symmetrical-smoothfilter strength 1
8                   Symmetrical-smoothfilter strength 2
9                   Symmetrical-smoothfilter strength 3
0                   Symmetrical-smoothfilter strength 4
other keys          DC/OFFSET = 0, continue...
left  mousekey      DC/OFFSET = 0, continue...
right mousekey      Input of a Zero-level with the mouse, after that continue

Input of a Zero-level with the mouse:
the Zero-level is given by a line between two points,
have both points different height the Signal is rotating!
press right mousekey to set the first point,
and then move mouse and press again for the second point.

the Filters are 1.Order but if you filter the signal several times the
order is adding. so bigger the strength of the smoothfilter,
so lower is the cutoff frequency of the virtual lowpass.

after this FFT4WAVE want to know where to save the new signal,
this is your last change for pressing 'Esc' (Undo-function).
the signal can be saved as reell DATA,
realpart of complex DATA, Imaginarypart of complex DATA.

#23  Eingabe mit Filtertyp SIN-Treppe

Input of DATA with the mouse (the mouse draw lines and set dots).

missing scanvalues are interpolated with a SIN-step Interpolation-Filter.
this Filter connect given scanvalues with half_sinus for interpolation.


after starting this function use the following keys:
-----------------------------------------------------
Esc               Undo, escape back to MENU!
Del               clean screen, draw scale_units (DIV), mouse-input again
Enter             accept all scanvalues , continue
right Mousekey    accept all scanvalues , continue
left  Mousekey    set dot, Line = hold mousekey and move the mouse
F9                write screen in BILD_???.BMP file
F10               like F9, but Farbe[2] (color) is dotted
R                 show old       Realpart maximum_scaled in Farbe[3] (color)
I                 show old  Imaginarypart maximum_scaled in Farbe[3] (color)
B                 show old Real&Imag.part maximum_scaled in Farbe[3] (color)

after scanvalues given by mouse, and 'Enter' is pressed, missing scanvalues
are interpolated, and the result of the interpolation is shown.
you can press 'F9' or 'F10' to write the screen as a Windows 3.0 BMP-file.
   (the BILD_???.BMP files are numbered automatically from 001 to 999)

now use the following keys:
-----------------------------------------------
Esc                 Undo, escape back to MENU!
1                   RC-smoothfilter strength 1
2                   RC-smoothfilter strength 2
3                   RC-smoothfilter strength 3
4                   RC-smoothfilter strength 4
5                   RC-smoothfilter strength 5
6                   RC-smoothfilter strength 6
7                   Symmetrical-smoothfilter strength 1
8                   Symmetrical-smoothfilter strength 2
9                   Symmetrical-smoothfilter strength 3
0                   Symmetrical-smoothfilter strength 4
other keys          DC/OFFSET = 0, continue...
left  mousekey      DC/OFFSET = 0, continue...
right mousekey      Input of a Zero-level with the mouse, after that continue

Input of a Zero-level with the mouse:
the Zero-level is given by a line between two points,
have both points different height the Signal is rotating!
press right mousekey to set the first point,
and then move mouse and press again for the second point.

the Filters are 1.Order but if you filter the signal several times the
order is adding. so bigger the strength of the smoothfilter,
so lower is the cutoff frequency of the virtual lowpass.

after this FFT4WAVE want to know where to save the new signal,
this is your last change for pressing 'Esc' (Undo-function).
the signal can be saved as reell DATA,
realpart of complex DATA, Imaginarypart of complex DATA.

#24  Eingabe mit Filtertyp Spezial

Input of DATA with the mouse (the mouse draw lines and set dots).

missing scanvalues are interpolated with a Spezial Interpolation-Filter.
this Filter does a gauss lowpass interpolation, many dots give good results.
the Spline-Order at interpolated scanvalues is 1+2 (Line+lowpass).


after starting this function use the following keys:
-----------------------------------------------------
Esc               Undo, escape back to MENU!
Del               clean screen, draw scale_units (DIV), mouse-input again
Enter             accept all scanvalues , continue
right Mousekey    accept all scanvalues , continue
left  Mousekey    set dot, Line = hold mousekey and move the mouse
F9                write screen in BILD_???.BMP file
F10               like F9, but Farbe[2] (color) is dotted
R                 show old       Realpart maximum_scaled in Farbe[3] (color)
I                 show old  Imaginarypart maximum_scaled in Farbe[3] (color)
B                 show old Real&Imag.part maximum_scaled in Farbe[3] (color)

after scanvalues given by mouse, and 'Enter' is pressed, missing scanvalues
are interpolated, and the result of the interpolation is shown.
you can press 'F9' or 'F10' to write the screen as a Windows 3.0 BMP-file.
   (the BILD_???.BMP files are numbered automatically from 001 to 999)

now use the following keys:
-----------------------------------------------
Esc                 Undo, escape back to MENU!
1                   RC-smoothfilter strength 1
2                   RC-smoothfilter strength 2
3                   RC-smoothfilter strength 3
4                   RC-smoothfilter strength 4
5                   RC-smoothfilter strength 5
6                   RC-smoothfilter strength 6
7                   Symmetrical-smoothfilter strength 1
8                   Symmetrical-smoothfilter strength 2
9                   Symmetrical-smoothfilter strength 3
0                   Symmetrical-smoothfilter strength 4
other keys          DC/OFFSET = 0, continue...
left  mousekey      DC/OFFSET = 0, continue...
right mousekey      Input of a Zero-level with the mouse, after that continue

Input of a Zero-level with the mouse:
the Zero-level is given by a line between two points,
have both points different height the Signal is rotating!
press right mousekey to set the first point,
and then move mouse and press again for the second point.

the Filters are 1.Order but if you filter the signal several times the
order is adding. so bigger the strength of the smoothfilter,
so lower is the cutoff frequency of the virtual lowpass.

after this FFT4WAVE want to know where to save the new signal,
this is your last change for pressing 'Esc' (Undo-function).
the signal can be saved as reell DATA,
realpart of complex DATA, Imaginarypart of complex DATA.

#31  Status-Information anzeigen
shows all Status-Information of the DATA in memory!
#32  Zeitb. <==vertauschen==> Freq.

swap FFTflag, the DATA self not change, but the Status:
DATA is time area / DATA is frequency area     swap!
that is usefull, if You import DATA, or input DATA with mouse,
(FFT4WAVE think that the Status of DATA is time area)
but You want that the Status of DATA is freqency area!

#33  ändere Abtastrate / Samplerate

change the Samplerate (scanvalues per second).
Nyquist criterion:  cutoff_frequency = Samplerate / 2
Functions like FFT of reell DATA, cutting inside the Visualize,
and Oversampling linear/Filter     correct the Samplerate too! 

#36  ändere die Gesamtdauer

change the fulltime / whole_duration of the DATA!
it change the Samplerate = DATAlength (how many scanvalues) / whole_duration
Functions like FFT of reell DATA, cutting inside the Visualize,
and Oversampling linear/Filter     correct the Samplerate too! 

#34  ändere Gitter_X / DIV Dauer

change the duration of a X_scale_unit (DIV) of an 'Input with Filter ??????'
it change the Samplerate = DATAlength (how many scanvalues) / (16*DIV_Time)
Functions like FFT of reell DATA, cutting inside the Visualize,
and Oversampling linear/Filter     correct the Samplerate too! 

#35  ändere Gitter_Y / DIV Amplitude

change the height of a Y_scale_unit (DIV) of an 'Input with Filter ??????'
It is important to change the height before You input the DATA,
because it work only on the following 'Input with Filter ??????'

#52  Y-Scalierung und Information

this Function shows how often a Amplitude exist in the DATA,
so it is very easy to see clipping or overdriven DATA...
It shows the amplitude of the biggest scanvalue, and use it for scaling.
the difference between the biggest ±values (Peak to Peak), is shown too!

DC/Offset is calculated and shown,
nearly all Soundcards cut very low freqencys <20Hz and DC with a highpass,
but most Soundcards have an offset-error, so that the DC/Offset shows the
offset-error of the Soundcard...

use key  'F9'  or  'F10'  for printing as BMP-file.

now you have the following possibilitys:
-----------------------------------------
with the key 'Esc' or the field 'STOP!' You escape to MENU!
the fields  'New Amplitude ?' ; 'Real & Imag.' ; 'only Real' and 'only Imag.'
allow it to scale the Amplitude (Y) of the DATA to a new value.

'New Amplitude ?'    scale reell DATA.
'Real & Imag.'       scale complex DATA      to one Amplitude.
'only Real.'         scale only the real     part of the DATA.
'only Imag.'         scale only the imaginarypart of the DATA.

It is very important, if You click with right or left MouseKEY on the field!
clicking with the right mousekey eliminate the DC/Offset before scale.

#53  X-Scalierung (Oversampling)
           X-Scaling have 3 subfunctions:
          ════════════════════════════════

'Impossiblity Drive'    'Oversampling Linear'    'Oversampling Filter'

Impossibilty Drive:
--------------------
waiting for the input of a new DATAlength, or the input of a Multiplyfactor.
is the value is not logic, the Function break off.
all DATA-formats are supported!

If the input value is small, then it is a Multiply factor, the DATA is repeate
by Multiplyfactor. the whole_duration is multiplyed too...

If the input is a DATAlength, the DATA is filled up to the new DATAlength,
with the last existing value. That can produce a DC-Offset...



Oversampling Linear:
---------------------
all DATA-formats are supported!
waiting for the input of a new DATAlength, then the DATA is stretched
to the new DATAlength (with linear interpolation resampling).
the physical in Visualize used scaling dont change, but the DATAlength does...
that mean DATAlength is something like resolution/precision.
If the new DATAlength > old DATAlegth then this is oversampling.
this reduce alising danger, but not the recording-alising.



Oversampling Filter:
---------------------
only reell DATA-format supported!
waiting for the input of a new DATAlength, then the DATA is stretched to the
new DATAlength. the physical in Visualize used scaling dont change,
but the DATAlength does...
that mean DATAlength is something like resolution/precision.
If the new DATAlength > old DATAlegth then this is oversampling.
this reduce alising danger, but not the recording-alising.
the Interpolation is done with a Filter, possible Filter-files have the
extension  *_.FFT     .our DATA is folding with Filter, it is a spezial Folding
called "Wild Diskrete Folding" (WDF). This folding-method allow to fold very
fast, reell diskrete DATA with different DATAlength and different Samplerate
to a new DATAlength. without amplitude-ERROR problems...

Das ganze beruht auf der verallgemeinerten Abtastreihe (VAR), und
der Filter repäsentiert einen 'Kern für verallgemeinerte Abtastreihen' (KVAR)

                        Filter(t)  =  KVAR(πt)

Da es sich bei dem Filter (KVAR) um eine gerade Funktion handelt, wird nur
die zweite (positive) Hälfte des Filters gelesen, und um den Faktor 2 linear
interpoliert. Jetzt wird der Filter so angesprochen: y = Filter( abs(t) )
Dieses Filter hat eine virtuelle Datenlänge von 32768.

#56  Nullpunktvertauschung_X

swapping the first half of the DATA with the second half of the DATA.
doing this twice give again the orginal state of the DATA. (like the FFT)

that Question is, for what is this good?
-----------------------------------------
the FFT Algorithm induce, a with the DATAlength periodic repeat, of our DATA,
in time area and in frequency area...
we conclude that in X-direction Zero is at left border ( = 0 ),
and Zero is at right border ( = Samplerate, whole_duration) too,
because the DATA are periodic with Samplerate or whole_duration.

the result of swapping the DATA is, like if Zero now in the middle of the DATA.
and so we get a for us more 'normal' state of the DATA.
Swapping from our 'normal'state of DATA bring us back to the FFT-State of DATA.

all DATA-formats are supported, but it is useless to do this with complex DATA,
produced over FFT of reell DATA. because the upper of the symmetrical half is
cutted to use memory more effective.

#30  umwandeln:  Polar => Real,Imag.

transformation of polar complex DATA in real & imaginary complex DATA
----------------------------------------------------------------------
the magnitude of the polar complex DATA is given in real part,
and the angle of the polar complex DATA is given in imaginary part.
range of angle must be 0...360°, or -180°...180°

this function transform the magnitude and angle given in the real & imag. part
in the normal complex DATA format that FFT4WAVE use...

#55  Absoluter Fehler: MEMORY - Datei.FFT

calculate the Difference between the DATA in MEMORY,
and the DATA given in the selected *.FFT file.

DATAlength must be the same, and DATAtype (reell/complex) must be the same.
Samplerate and Status of DATA can be different, FFT4WAVE warn you then,
because sometimes it make no sense, if it is different...

If the DATA in the *.FFT file are the correct DATA, then the difference
between MEMORY - FILE is the  absolute ERROR!

#60  complexe Faltung: MEMORY * Datei.FFT

folding the DATA in MEMORY with the DATA given in the selected *.FFT file.
--------------------------------------------------------------------------
DATAlength must be the same, and both DATAtypes must be complex DATA.
Samplerate and Status of DATA can be different, FFT4WAVE warn you then,
because sometimes it make no sense, if it is different...

this folding is a FFT based folding, so the DATA is periodic repeat with the
DATAlength. the result of this is, that amplitude_correction_faktors are need.
different Signaltypes like dirac, cos, single pulses, ... need different
amplitude_correction_faktors, this is not easy to solve, it is impossible!
the form of the Signal is okay, but don't forget the border effect.
are both Samplerates identical, then the X-scaling is okay too.


this folding is not good for Mathematics, but is usefull as Universal-Filter:

g(t) = s(t) * h(t)

s(t) is our complex input-signal in time_area.
g(t) is our complex outputsignal im time_area.
h(t) is the inverse FFT of the Filterform in frequency_area.

#54  Hanning Fenster

all DATA-formats are supported, all DATA is multiplicate with a Hanning Window
doing this can be usefull, before you do the FFT...

DATA(t) = DATA(t) ∙ ( 0.5 - 0.5 ∙ cos(2πt/T) )

now amplitude goes to zero at left & right border of the DATA.
that prevents jumps in the Signal, by the periodic repeat, given by the FFT.
now the DATAlength must not be longer a multiply of the DATA_period.

the signal_form of the FFT is now okay, but we have again a unknown
amplitude_correction_factor...

#51  Visualisierung

this Function is for visualize the DATA, and for printing and cutting.
it is possible to reduce the DATAlength on the zoom-window, it is possible to
cut the zoom-window out of the DATA. the rest is then away forever!

In the left upper corner we can see the exact X/Y values of the cursor.
It is possible to set a new zero at cursor-position, with the keys  'S' 'X' 'Y'
to scan length differences, a delta before the value show you, that a new zero
is set.    use the key 'N' or 'Z' to set zero to normal state back.


use the following keys:
-------------------------------------------------------------------------------
F1               shows active keys  (Quick Help)
F9               write screen in BILD_???.BMP file, (Windows 3.0 Graphicformat)
F10              write screen in BILD_???.BMP file, Farbe[2] (color) is dotted.
<--              cutting the actually zoom-window from DATA,and then break off.
Esc              Escape visualize (break off).
S                Set new Zero for X and Y
X                Set new Zero for X-direction
Y                Set new Zero for Y-direction
N                Set normal Zero
Z                Set normal Zero
+                Amplitude 'Zoom in'    (zoom-window in Y-direction bigger)
-                Amplitude 'Zoom out'   (zoom-window in Y-direction smaller)
left  Mousekey   'Zoom in' set upper left corner of the new zoom-window, press
                 this key again set lower right corner of new zoom-window,
                 if you press some else key, 'Zoom in' is break off!
right Mousekey   'Zoom out', make zoom-window   factor 3  bigger.


the following keys work only with complex DATA:
-------------------------------------------------------------------
A                Amplitude (magnitude)
L                20 * log10(magnitude)
P                show Polar complex DATA, magnitude and angle.
R                show only Realpart
I                show only Imaginarypart
B                show both Realpart and Imaginarypart (splitscreen)

#50  FFT / inverse FFT
Fast Fourier Transformation:
----------------------------
this function do the FFT or the inverse_FFT of the DATA,
time_area = FFT, frequency_area = inverse_FFT.

the FFT Algorithm induce, a with the DATAlength periodic repeat,
 of our DATA, in time area and in frequency area...
our DATA is periodic repeat with Samplerate or whole_duration.
Periodicwidth_frequency_area = DATAlength / Periodicwidth_time_area
this bring us problems, if we want the FFT of a single impulse,
but we get only the FFT of a continuous impulse !
exactly: we get the fft, of a single impulse fold with continuous diracpulse
of the pulsewidth 'whole duration' and the weight (1).
the FFT of a continuous diracpulse of the pulswidth 'whole duration' have
the amplitudefactor 1/whole_duration.
to get the correct amplitude of the FFT of a single impluse, we must multiply
the result with the amplitude_correction_factor 'whole duration'. 

 ╔═════════════╗                           ╔═════════════╗
 ║─┐         ┌─║           ┌───┐         ┌─║─┐         ┌─║─┐         ┌───┐
 ║ │         │ ║     ....  │   │         │ ║ │         │ ║ │         │   │ ....
 ║ └─────────┘ ║         ──┘   └─────────┘ ║ └─────────┘ ║ └─────────┘   └─
 ╚═════════════╝                           ╚═════════════╝
 2 short Impulse                       continuous long Impulse

it existing two different FFT/inverseFFT algorithm,
the FFT/inverseFFT of complex DATA, and the FFT/inverseFFT of reell DATA.
the FFT/inverseFFT of complex DATA is better because the inverse FFT work
perfect, the inverse FFT of FFT of reell DATA not work always perfect.
but the FFT of reell DATA use the memory more efficient!
the FFT of  reell  DATA give back 0...Samplerate/2,
the FFT of complex DATA give back 0...Samplerate.
the DATA of 0...Samplerate/2 is a mirror of Samplerate/2...Samplerate.

            0...Samplerate/2 =  0...Nyquist_freqency
 Samplerate/2...Samplerate   = -Nyquist_freqency...0

0 and Samplerate  = zero in x-direction. use 'Zero_swapping_shifting_X'
if you want one Zero in the middle of the DATA...
the FFT/inverseFFT work not with every DATAlength, it is often usefull,
to use Oversampling to a better DATAlegth, to prevent a systemcrash !!!
it can also be usefull to use 'Hannig Window' before you do the FFT.

Lars Otte, 
          Autor of FFT4WAVE


------------------------------------------------------------------------------
THIS PROGRAM CALCULATES THE FAST FOURIER TRANSFORM OF VERY LONG SERIES,
AS LONG AS YOUR FAR HEAP ALLOWS. FOR EXAMPLE, USING DOUBLE PRECISION IT
IS POSIBLE TO PROCESS 70.000 REAL DATA POINTS. IT IMPLEMENTS R. C.
SINGLETON'S MIXED RADIX FAST FOURIER ALGORITHM. SOME FEATURES OF THIS
ALGORITHM ARE: 1) THE LENGTH OF THE SERIES DOES NOT HAVE TO BE BE
NECESSARILY A POWER OF TWO, THE LENGTH MAY INCLUDE FACTORS OF 2 AND 4,
AND ALSO ODD FACTORS AS 3,5,7, ETC,2-) TO AVOID TRUNCATION ERRORS, THE
SINES AND COSINES ARE GENERATED RECURSIVELY, 3-) THE DATA AND ITS
TRANSFORM ARE ACCESSED WITH HUGE POINTERS.


DATA SIZE RESTRICTION:

The series has to fit in conventional memory (ie. far heap). Using
double precision it means somewhere around 70.000 real data points
(547 K bytes), depending on your system configuration.

  
TRUNCATION ERRORS ARE A BIG PROBLEM:

First I used two FFT subroutines found in SYMTEL and modified them
using huge pointers to access the data. Everything worked fine until
I started transforming series 12K long and above. It took me a while
to figure out the problem was in the truncation errors when calculating
the sines and cosines using the library functions.

METHOD:

I translated to C, R. C. Singleton's mixed radix fast Fourier transform
algorithm (see reference in SING.C). His algorithm generates the 
sines and cosines recursively and corrects for truncation errors.

DATA LENGTH

Does not have to be a power of 2 necessarily. The length can contain
even factors as 2 and 4, and also odd factors as 3,5, 7, 11, etc.
The algorithm is most efficient if the length is a power of four.
Data lengths with odd factors of 3 and 5 can be used without a great
loss in performance.


    This functions are translations from the fortran program in
    R. C. Singleton, An algorithm for computing the mixed radix fast
    Fourier transform 
  
    IEEE Trans. Audio Electroacoust., vol. AU-17, pp. 93-10, June 1969.

**************************************************************
*  Javier Soley, Ph. D,   FJSOLEY @UCRVM2.BITNET             *
*  Escuela de Física y Centro de Investigaciones Geofísicas  *
*  Universidad de Costa Rica                                 *
**************************************************************